package com.lxy.auth.utils;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import cn.hutool.jwt.JWT;
import com.lxy.auth.dto.UserDto;
import org.apache.commons.lang3.StringUtils;

/**
 * JWT工具类
 */
public class JWTUtil {

    /**
     * 秘钥
     */
    private static final byte[] KEY = "abcdefg".getBytes();

    /**
     * 过期时间
     */
    private static final long EXPIRE =  7 * 24 * 60 * 60;

    private static final String JWT_KEY_PHONE = "phone";
    /**
     * token身份
     */
    private static final String JWT_KEY_IDENTITY = "identity";

    /**
     * Token类型
     */
    private static final String TOKEN_TYPE = "tokenType";


    private JWTUtil() {
    }

    /**
     * 根据 userDto 生成 token
     *
     * @param dto    用户信息
     * @return token
     */
    public static String generateTokenForUser(UserDto dto) {
        Map<String, Object> map = new HashMap<>();
        map.put("id", dto.getUserId());
        map.put("username", dto.getUsername());
        return generateToken(map);
    }

    /**
     * 根据 map 生成 token 默认：HS265(HmacSHA256)算法
     *
     * @param map    携带数据
     * @return token
     */
    public static String generateToken(Map<String, Object> map) {
        JWT jwt = JWT.create();
        // 设置携带数据 ==(key, value) -> jwt.setPayload(key, value)
        map.forEach(jwt::setPayload);
        // 设置密钥
        jwt.setKey(KEY);
        // 设置过期时间
        jwt.setExpiresAt(new Date(System.currentTimeMillis() + EXPIRE * 1000));
        return jwt.sign();
    }

    /**
     * token 校验
     * @param token token
     * @return 是否通过校验
     */
    public static boolean verify(String token) {
        if (StringUtils.isBlank(token)) return false;
        return JWT.of(token).setKey(KEY).verify();
    }

    /**
     * token 校验，并获取 userDto
     * @param token token
     * @return userDto
     */
    public static UserDto verifyAndGetUser(String token) {
        if(!verify(token)) return null;
        // 解析数据
        JWT jwt = JWT.of(token);
        Long id = Long.valueOf(jwt.getPayload("id").toString());
        String nickname = jwt.getPayload("nickname").toString();
        // 返回用户信息
        return new UserDto();
    }
}
